Skip to content

fix(weixin): reject nonzero send ret - #211

Closed
louiseboo wants to merge 102 commits into
EverMind-AI:mainfrom
louiseboo:fix/wechat-send-ret-forkbase
Closed

louiseboo wants to merge 102 commits into
EverMind-AI:mainfrom
louiseboo:fix/wechat-send-ret-forkbase

Conversation

@louiseboo

Copy link
Copy Markdown

Summary

  • Treat a non-zero iLink ret as a failed WeChat text send even when errcode is zero.
  • Include ret, errcode, and the server message in the raised error.
  • Add a regression test for the observed sanitized response {ret: -2, errcode: 0, errmsg: "prepare failed"}.

Fixes #210

Why

_send_text() only checked errcode. iLink can reject message preparation with a non-zero ret and errcode=0, causing Raven callers to report a false successful delivery. _poll_once() already treats either field as authoritative failure status.

Verification

  • Red: the new regression test failed with DID NOT RAISE before the implementation change.
  • Green: uv run pytest tests/test_channels_weixin.py::test_send_text_rejects_nonzero_ret_even_when_errcode_is_zero -q → 1 passed.
  • Relevant suite: uv run pytest tests/test_channels_weixin.py tests/test_channels_manager.py tests/test_channels_outlet.py -q → 71 passed.
  • uv run ruff check raven/channels/adapters/weixin/channel.py tests/test_channels_weixin.py → clean.
  • uv run ruff format --check raven/channels/adapters/weixin/channel.py tests/test_channels_weixin.py → clean.

Risk

Low. The success path (ret=0, errcode=0, or absent zero-default fields) is unchanged. The only behavior change is that a server-declared failure now propagates to the caller instead of being silently treated as success.

Rollback

Revert commit 2d8cd2f; no data migration or configuration change is involved.

Privacy

The issue and test use sanitized identifiers and content. No user tokens, chat IDs, local paths, or private messages are included.

0xKT and others added 30 commits June 29, 2026 00:23
Replace the hardcoded, stale commit-scope list in CLAUDE.md section 3.3
with a pointer to the README Repo layout section, and finish the
public-phase wording: drop the internal-AI-stats framing and the
GitLab-era JIRA / merge-request residue from the trailer rules, the
PR-open flow, and the PR template.

Co-authored-by: Claude (claude-opus-4-8) <noreply@anthropic.com>
…e_and_template_cleanup

docs: point commit-scope at README and finish public-phase cleanup
…adius

Prompt injection can't be fully prevented, so this hardens defense-in-depth:
label untrusted content with a tamper-resistant boundary the model is told to
treat as data, and shrink the blast radius of a successful injection. Scope
follows the analysis report — high-value, low-complexity items; deeper items
(sandbox default flip, capability tokens, MCP/skill signing, memory audit log)
are deliberately deferred.

- security/trust.py: wrap_untrusted() fences external content with a per-call
  random nonce, so embedded fake close-markers can't escape the fence.
- system prompt: a guideline telling the model to treat fenced/external content
  as data, watch for "ignore the above" / "you are now" style directives, and
  confirm high-impact actions via ask_user.
- fence untrusted tool output at the single chokepoint
  (ContextBuilder.add_tool_result) and inside the subagent's own loop, plus the
  subagent result re-injected into the main agent.
- fence recalled memory and the sentinel's memory/attention context as
  unverified; the planner is told unverified content must not drive privileged
  actions (spawn / nudge).
- web_fetch: use security.network.validate_url_target (DNS-resolving SSRF check)
  instead of the previous scheme-only validator.
- DirectExecutor: pass only an env allowlist (no host secrets) rather than the
  full host environment; warn loudly when running unsandboxed (backend=none).
- subagents: per-session rolling-hour spawn rate limit (auto-recovering) to stop
  a prompt-injected re-injection loop without locking out legitimate use.

Co-authored-by: Claude (claude-opus-4-8) <noreply@anthropic.com>
…-turns switch

Wire the TUI /model command end to end: model.* RPC handlers
(options / save_key / disconnect / add_model / remove_model); a
config.set "model" branch that rebuilds the live provider and reassigns
the agent loop so a switch takes effect on the next turn (guarded by
is_turn_active); ProviderConfig.models for the manual picker catalogue;
the custom provider routed through LiteLLM; and a base
LLMProvider.chat_stream non-streaming fallback so non-litellm providers
degrade gracefully instead of crashing. Frontend: the model picker gains
an api_base input, inline model add/delete, and a structured switch
through config.set; openrpc-derived types regenerated.

Co-authored-by: Claude (claude-opus-4-8) <noreply@anthropic.com>
feat: add TUI /model — provider/model config CRUD and between-turns model switch
…ning_untrusted_content

feat(security): label untrusted content and contain injection blast radius
Two related changes to the EverOS-backed memory subsystem.

Migrated three recall improvements from the legacy everclaw repo
(env vars renamed EVERCLAW_* -> RAVEN_*):
- drop current-session hits from the # Memory recall so it does not
  duplicate the live conversation already in the history window
  (over-fetch top_k*2, then filter by session_id)
- add `raven agent --message-file` for prompts beyond the shell ARG_MAX
- env-gated episodic recall + preference annotation in the consolidator
  (RAVEN_EPISODIC_TOPK / RAVEN_ANNOTATE_PREFS / RAVEN_EPISODIC_CLUSTER),
  default-off

Restructured when EverOS is invoked so native memory owns short-term and
EverOS owns long-term:
- recall is now on-miss: native runs every turn; EverOS user-track recall
  fires only when native surfaces nothing relevant to the query
- the per-turn EverOS store is removed; EverOS consolidation runs only
  (a) intra-day when a session crosses everos_consolidation_threshold_pct
  of the context window (default 80, background, non-blocking) and
  (b) nightly at everos_nightly_consolidation_hour (default 0, offline)
- backend.store gains force_flush to promote a batch immediately;
  consolidation is incremental per session (metadata watermark) so the
  two triggers never double-ingest
- native short-term compaction (maybe_consolidate_by_tokens) is unchanged

Tests: unit coverage for the threshold / nightly / on-miss paths plus a
full in-memory lifecycle smoke, and a real-everos e2e for the
force_flush single-store recall path.

Co-authored-by: Claude (claude-opus-4-8) <noreply@anthropic.com>
EverOS defaulted both its user-level config toml and its data root
(sqlite / lancedb / .index / ome.db) to a bare ~/.everos. Scope raven's
instance under ~/.everos/raven so config and data stay isolated from any
other EverOS consumer on the machine.

Add update_everos.configure_everos_env(): it sets EVEROS_CONFIG_FILE and
EVEROS_MEMORY__ROOT via setdefault (so an explicit operator override
still wins) before EverOS's @cache-d load_settings() first runs. The
everos backend factory and the understand_media tool factory call it as
the earliest raven-controlled EverOS entry points; _EVEROS_CONFIG now
derives from a single _EVEROS_BASE constant.

No data migration: existing ~/.everos data is left untouched and a fresh
~/.everos/raven is created lazily on first write/use.

Co-authored-by: Claude (claude-opus-4-8) <noreply@anthropic.com>
A fresh onboard now materializes the user-facing subset of the memory /
plugins / skillForge extension blocks into ~/.raven/config.json so the
knobs are discoverable and editable without reading the source. Seeding
is setdefault-based (non-clobbering) and runs on every onboard, so it
also backfills a pre-existing config that predates these blocks.

- memory.backend defaults to "everos" (schema default); _memory_enabled
  now gates on an llm model being present, so a fresh modelless seed is
  treated as "not yet enabled" and the skip / non-interactive guard still
  resolves it to None when memory is opted out or left unconfigured.
- skillForge.everos.enabled is seeded on; router.hub.endpoint is seeded
  to the shared Skill Hub URL with apiKey left null for the user to fill.
- plugins.config["everos-memory"] is seeded with identity wiring that
  mirrors memory.userId / agentId so recall identities match.
- internal-infra fields (embedding / reranker endpoints + their API keys,
  mass_library_db) are NOT written, so a real Bearer token never lands in
  a plaintext config; they stay at their schema defaults.

Co-authored-by: Claude (claude-opus-4-8) <noreply@anthropic.com>
…lt_extension_blocks

Feat/onboard default extension blocks
…recall_improvements

feat: native short-term memory + everos long-term consolidation
…_memory_recall_improvements"

This reverts commit b88ea17, reversing
changes made to 5d9887e.
…_memory_recall

revert: pr EverMind-AI#9 native short-term memory + everos long-term consolidation
…readme_ci

chore: prepare open source launch
## Summary
- switch project metadata and license text to Apache-2.0 while retaining
upstream notices
- add public-ready community files: issue templates, SECURITY,
CONTRIBUTING, CODE_OF_CONDUCT, Dependabot, and a stricter PR template
- align README license copy with the public launch posture

## Repository settings updated via GitHub API
- squash-only merge enabled; merge commit and rebase merge disabled
- delete branch on merge and update branch enabled
- Discussions enabled; Projects and Wiki disabled
- Actions default workflow permissions set to read-only and PR
self-approval disabled
- description and homepage updated for Raven

## Verification
- npm ci --ignore-scripts --no-audit --no-fund (root)
- npm ci --ignore-scripts --no-audit --no-fund (ui-tui)
- npm ci --ignore-scripts --no-audit --no-fund (bridge)
- npx --no-install commitlint --from origin/main --to HEAD --config
commitlint.config.cjs
- PYTHONPATH=. python3 scripts/check_commit_messages.py
origin/main..HEAD
- uv run pre-commit run --from-ref origin/main --to-ref HEAD
- git diff --check origin/main...HEAD

## Notes
- GitHub branch protection/rulesets returned 403 while the repository is
private on the current plan. Enable required checks after making the
repository public.
- Auto-merge remained disabled after the API patch, likely due
repository/org availability or policy.
## Summary
- add lightweight overview files for top-level repository sections that
still displayed old non-conventional commit messages
- update existing benchmark and demo READMEs with public-facing guidance
- make the GitHub directory listing show a clean conventional commit
message after merge without rewriting main history

## Verification
- uv run pre-commit run --files LICENSES/README.md benchmarks/README.md
demos/README.md docs/README.md raven/README.md tests/README.md
- npx --no-install commitlint --from origin/main --to HEAD --config
commitlint.config.cjs
- PYTHONPATH=. python3 scripts/check_commit_messages.py
origin/main..HEAD
- uv run pre-commit run --from-ref origin/main --to-ref HEAD

## Note
A normal pull request cannot rename historical commits already merged
into main. This PR instead updates the affected directories with useful
public-facing overview docs so GitHub displays the new conventional
commit as the latest directory change.
Bumps
[python-socketio](https://github.com/miguelgrinberg/python-socketio)
from 5.16.1 to 5.16.2.
<details>
<summary>Release notes</summary>
<p><em>Sourced from <a
href="https://github.com/miguelgrinberg/python-socketio/releases">python-socketio's
releases</a>.</em></p>
<blockquote>
<h2>Release 5.16.2</h2>
<p>See <a
href="https://github.com/miguelgrinberg/python-socketio/blob/main/CHANGES.md">CHANGES.md</a>
for release notes.</p>
</blockquote>
</details>
<details>
<summary>Changelog</summary>
<p><em>Sourced from <a
href="https://github.com/miguelgrinberg/python-socketio/blob/main/CHANGES.md">python-socketio's
changelog</a>.</em></p>
<blockquote>
<h1>python-socketio change log</h1>
<p><strong>Release 5.16.3</strong> - 2026-06-15</p>
<ul>
<li>Catch all exceptions in redis and rabbitmq client managers <a
href="https://redirect.github.com/miguelgrinberg/python-socketio/issues/1581">#1581</a>
(<a
href="https://github.com/miguelgrinberg/python-socketio/commit/80bb5c9b07e6b53e45f610ec29a24124c539d41b">commit</a>)</li>
</ul>
<p><strong>Release 5.16.2</strong> - 2026-05-21</p>
<ul>
<li>Prevent unnecessary resource allocations <a
href="https://redirect.github.com/miguelgrinberg/python-socketio/issues/1574">#1574</a>
(<a
href="https://github.com/miguelgrinberg/python-socketio/commit/ca140fe44d0ceb3004073645222abec182d8784b">commit</a>)</li>
<li>Add zizmor to CI builds <a
href="https://redirect.github.com/miguelgrinberg/python-socketio/issues/1570">#1570</a>
(<a
href="https://github.com/miguelgrinberg/python-socketio/commit/664dc27ec6f34179ed1724430eda3520627fc642">commit</a>)</li>
</ul>
<p><strong>Release 5.16.1</strong> - 2026-02-06</p>
<ul>
<li>Use configured JSON module in managers <a
href="https://redirect.github.com/miguelgrinberg/python-socketio/issues/1549">#1549</a>
(<a
href="https://github.com/miguelgrinberg/python-socketio/commit/6229261ae6e8c01e675097242e333ee84587a544">commit</a>)</li>
<li>Admin UI fixes: remove duplicate tasks, report transport upgrades
(<a
href="https://github.com/miguelgrinberg/python-socketio/commit/1c2eab13a92fac9e43663eb0b5f099eb1c40ea5b">commit</a>)</li>
<li>Switch to Furo documentation template (<a
href="https://github.com/miguelgrinberg/python-socketio/commit/add47d8c7abca697a2804141bbf29bfb095f7d5e">commit</a>)</li>
<li>Add Python free-threading to CI <a
href="https://redirect.github.com/miguelgrinberg/python-socketio/issues/1554">#1554</a>
(<a
href="https://github.com/miguelgrinberg/python-socketio/commit/ccdd2004a038ae4b8171a05120c5d0787332f7ee">commit</a>)</li>
</ul>
<p><strong>Release 5.16.0</strong> - 2025-12-24</p>
<ul>
<li>Address deprecation warnings (<a
href="https://github.com/miguelgrinberg/python-socketio/commit/b235699d9b06564753c570b76055997e9d62a938">commit</a>)</li>
<li>Drop Python 3.8 and 3.9 from CI builds (<a
href="https://github.com/miguelgrinberg/python-socketio/commit/d0728d2f74538762dd551fa9cd0cd1fd5aedfa37">commit</a>)</li>
</ul>
<p><strong>Release 5.15.1</strong> - 2025-12-16</p>
<ul>
<li>Restore support multiple arguments via pubsub emits <a
href="https://redirect.github.com/miguelgrinberg/python-socketio/issues/1540">#1540</a>
(<a
href="https://github.com/miguelgrinberg/python-socketio/commit/c279f26bb8c9887c4ca99d4d81ad331c4844438c">commit</a>)</li>
</ul>
<p><strong>Release 5.15.0</strong> - 2025-11-22</p>
<ul>
<li>Retry initial Redis connection <a
href="https://redirect.github.com/miguelgrinberg/python-socketio/issues/1536">#1534</a>
([commit <a
href="https://redirect.github.com/miguelgrinberg/python-socketio/issues/1">#1</a>](<a
href="https://github.com/miguelgrinberg/python-socketio/commit/1e903e173a2d7b04599c4f7f9630c1abbb531fad">https://github.com/miguelgrinberg/python-socketio/commit/1e903e173a2d7b04599c4f7f9630c1abbb531fad</a>)
[commit <a
href="https://redirect.github.com/miguelgrinberg/python-socketio/issues/2">#2</a>](<a
href="https://github.com/miguelgrinberg/python-socketio/commit/5e898a9b93526e6e667767e54c60f4c84589989d">https://github.com/miguelgrinberg/python-socketio/commit/5e898a9b93526e6e667767e54c60f4c84589989d</a>))</li>
<li>Correctly regenerate RabbitMQ binding after a connection failure <a
href="https://redirect.github.com/miguelgrinberg/python-socketio/issues/1516">#1516</a>
(<a
href="https://github.com/miguelgrinberg/python-socketio/commit/c52e93b4a328d98a968bfbdec0cfd598b73ee913">commit</a>)
(thanks <strong>Gritty_dev</strong>!)</li>
<li>Support <code>ext_type</code> in the <code>MsgPackPacket</code>
class <a
href="https://redirect.github.com/miguelgrinberg/python-socketio/issues/1521">#1521</a>
(<a
href="https://github.com/miguelgrinberg/python-socketio/commit/208925344a48485d2cd56e40eb74266c3bcb5311">commit</a>)</li>
<li>Support sending <code>bytesarray</code>s when using pub/sub managers
(<a
href="https://github.com/miguelgrinberg/python-socketio/commit/6c9b9974f72e2efdf62407ecab24ee6995448098">commit</a>)</li>
<li>Fix typos in documentation <a
href="https://redirect.github.com/miguelgrinberg/python-socketio/issues/1520">#1520</a>
(<a
href="https://github.com/miguelgrinberg/python-socketio/commit/db3f1c2a0105c30cb833ddfca8f05fe4320468fd">commit</a>)
(thanks <strong>Lê Nam Khánh</strong>!)</li>
<li>Improvements to the logging documentation (<a
href="https://github.com/miguelgrinberg/python-socketio/commit/b423d0e38eef559b7e81acb7e32059de305f982c">commit</a>)</li>
</ul>
<p><strong>Release 5.14.3</strong> - 2025-10-29</p>
<ul>
<li>Support Python's native <code>ConnectionRefusedError</code>
exception to reject a connection <a
href="https://redirect.github.com/miguelgrinberg/python-socketio/issues/1515">#1515</a>
(<a
href="https://github.com/miguelgrinberg/python-socketio/commit/f3b18bde3f16437b223491d4c3e440ea37105fe3">commit</a>)</li>
<li>Push binary data to the aiopika client manager <a
href="https://redirect.github.com/miguelgrinberg/python-socketio/issues/1514">#1514</a>
(<a
href="https://github.com/miguelgrinberg/python-socketio/commit/194e1b7f277b5f72e1de78d3f614e7b8b6c788ac">commit</a>)</li>
</ul>
<p><strong>Release 5.14.2</strong> - 2025-10-15</p>
<ul>
<li>Restore binary message support in message queue setups <a
href="https://redirect.github.com/miguelgrinberg/python-socketio/issues/1509">#1509</a>
(<a
href="https://github.com/miguelgrinberg/python-socketio/commit/bab4a10f48aaae11d7f832ebe5c30ad3f85d31b3">commit</a>)</li>
<li>Fix formatting of client connection error <a
href="https://redirect.github.com/miguelgrinberg/python-socketio/issues/1507">#1507</a>
(<a
href="https://github.com/miguelgrinberg/python-socketio/commit/f298c9b54d76ab09ff72935937e1b9575bc45ffd">commit</a>)</li>
<li>Add 3.14 and pypy-3.11 CI tasks (<a
href="https://github.com/miguelgrinberg/python-socketio/commit/1f4cd3b025c294f25208ec3c05b5f8df6209e403">commit</a>)</li>
<li>Improve documentation of the
<code>BaseManager.get_participants()</code> method (<a
href="https://github.com/miguelgrinberg/python-socketio/commit/33722a0d96036f005188b07b8b46a5ef091fe65f">commit</a>)</li>
</ul>
<p><strong>Release 5.14.1</strong> - 2025-10-02</p>
<!-- raw HTML omitted -->
</blockquote>
<p>... (truncated)</p>
</details>
<details>
<summary>Commits</summary>
<ul>
<li><a
href="https://github.com/miguelgrinberg/python-socketio/commit/6e2b7175c97c2785edd2ea60df026c12240c785c"><code>6e2b717</code></a>
Release 5.16.2</li>
<li><a
href="https://github.com/miguelgrinberg/python-socketio/commit/cb658291085842372a16863d83e14373f85b3d3e"><code>cb65829</code></a>
update python-engineio version</li>
<li><a
href="https://github.com/miguelgrinberg/python-socketio/commit/ca140fe44d0ceb3004073645222abec182d8784b"><code>ca140fe</code></a>
prevent unnecessary resource allocation (<a
href="https://redirect.github.com/miguelgrinberg/python-socketio/issues/1574">#1574</a>)</li>
<li><a
href="https://github.com/miguelgrinberg/python-socketio/commit/b29beef6bfd38d5a3c3b89da96b7a4574a91efcf"><code>b29beef</code></a>
tox configuration</li>
<li><a
href="https://github.com/miguelgrinberg/python-socketio/commit/e8981302a3d5b525ee73c2ec9c13859ce2f764e8"><code>e898130</code></a>
Bump ujson from 5.4.0 to 5.12.1 in /examples/server/sanic (<a
href="https://redirect.github.com/miguelgrinberg/python-socketio/issues/1573">#1573</a>)
#nolog</li>
<li><a
href="https://github.com/miguelgrinberg/python-socketio/commit/05c32f5da85fe5e5d647c937c7eab0972760ca05"><code>05c32f5</code></a>
Bump qs and body-parser in /examples/server/javascript (<a
href="https://redirect.github.com/miguelgrinberg/python-socketio/issues/1572">#1572</a>)
#nolog</li>
<li><a
href="https://github.com/miguelgrinberg/python-socketio/commit/287dc6715b801d319f5baa0fb727e232e728b8aa"><code>287dc67</code></a>
Bump qs and body-parser in /examples/client/javascript (<a
href="https://redirect.github.com/miguelgrinberg/python-socketio/issues/1571">#1571</a>)
#nolog</li>
<li><a
href="https://github.com/miguelgrinberg/python-socketio/commit/664dc27ec6f34179ed1724430eda3520627fc642"><code>664dc27</code></a>
add zizmor to ci (<a
href="https://redirect.github.com/miguelgrinberg/python-socketio/issues/1570">#1570</a>)</li>
<li><a
href="https://github.com/miguelgrinberg/python-socketio/commit/14c62366a85cfe34e0bd69a22b905eb329873dd3"><code>14c6236</code></a>
Bump django in /examples/server/wsgi/django_socketio (<a
href="https://redirect.github.com/miguelgrinberg/python-socketio/issues/1566">#1566</a>)
#nolog</li>
<li><a
href="https://github.com/miguelgrinberg/python-socketio/commit/29b2e5cdbe87e8216bc46fccb864b84ab9f55cf9"><code>29b2e5c</code></a>
Bump aiohttp from 3.13.3 to 3.13.4 in /examples/server/aiohttp (<a
href="https://redirect.github.com/miguelgrinberg/python-socketio/issues/1565">#1565</a>)
#nolog</li>
<li>Additional commits viewable in <a
href="https://github.com/miguelgrinberg/python-socketio/compare/v5.16.1...v5.16.2">compare
view</a></li>
</ul>
</details>
<br />


[![Dependabot compatibility
score](https://dependabot-badges.githubapp.com/badges/compatibility_score?dependency-name=python-socketio&package-manager=uv&previous-version=5.16.1&new-version=5.16.2)](https://docs.github.com/en/github/managing-security-vulnerabilities/about-dependabot-security-updates#about-compatibility-scores)

Dependabot will resolve any conflicts with this PR as long as you don't
alter it yourself. You can also trigger a rebase manually by commenting
`@dependabot rebase`.

[//]: # (dependabot-automerge-start)
[//]: # (dependabot-automerge-end)

---

<details>
<summary>Dependabot commands and options</summary>
<br />

You can trigger Dependabot actions by commenting on this PR:
- `@dependabot rebase` will rebase this PR
- `@dependabot recreate` will recreate this PR, overwriting any edits
that have been made to it
- `@dependabot show <dependency name> ignore conditions` will show all
of the ignore conditions of the specified dependency
- `@dependabot ignore this major version` will close this PR and stop
Dependabot creating any more for this major version (unless you reopen
the PR or upgrade to it yourself)
- `@dependabot ignore this minor version` will close this PR and stop
Dependabot creating any more for this minor version (unless you reopen
the PR or upgrade to it yourself)
- `@dependabot ignore this dependency` will close this PR and stop
Dependabot creating any more for this dependency (unless you reopen the
PR or upgrade to it yourself)
You can disable automated security fix PRs for this repo from the
[Security Alerts
page](https://github.com/EverMind-AI/Raven/network/alerts).

</details>

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
0xKT and others added 27 commits July 7, 2026 16:01
## Summary

AGENTS.md described the repo as rebase-merge, but it is configured
squash-only (`squash_merge_commit_message=PR_BODY`; rebase and
merge-commit disabled). Correct 3.3, 3.5, and 3.7 to the real policy:
rebase only freshens the branch before push, squash on merge; the squash
commit body comes from the PR description (commit bodies are dropped),
and GitHub auto-collects each commit's `Co-authored-by` -- so keep the
trailer in the commit and put `Closes` / reviewer context in the PR
description.

## Type

- [x] Docs

## Verification

Docs-only. Policy verified against `gh api repos/EverMind-AI/Raven`
(squash-only, `PR_BODY`) and as observed on the EverMind-AI#95 squash commit.

- [x] User-facing docs or screenshots are updated when needed

## Risk

Docs-only; no code or behavior change.

## Related Issues

N/A

Co-authored-by: Claude (claude-opus-4-8) <noreply@anthropic.com>
…Mind-AI#97)

## Summary

Give channel field specs a single source of truth for required/optional:
the schema
declares it, `channels show` displays it, and the onboard wizard uses
it.

This fixes the onboard wizard's `idx>0` heuristic, which showed an
"empty to skip" hint
on required non-first fields (e.g. feishu `app_secret`) — inviting users
to skip a
credential the channel needs to start.

- Mark required fields with `Field(json_schema_extra={"required":
True})`, mirroring the
existing `is_secret` escape hatch. Defaults are kept, so
`ChannelsConfig`'s
`default_factory` construction of every channel still loads (no config
migration).
- `_flatten_fields` exposes a `required` spec key; `channels show` gains
a `Required?` column.
- The wizard gates the skip hint on the marker. This drops the
misleading hint only —
empty submits are still silently ignored as before (no new enforcement
added).

Required sets were audited against each adapter's `start()` guard across
all 12 channels.
matrix / whatsapp / weixin have no hard guard and are marked by product
judgment.

Scope is channels only; providers share the spec model but their table
is left unchanged.

## Type

- [x] Feature

## Verification

- [x] Relevant tests pass locally
- [x] Relevant lint / type checks pass locally

```
uv run pytest tests/test_config_update_channels.py tests/test_cli_channel_commands.py \
  tests/test_cli_onboard_commands.py tests/test_channels_required_marker.py -q
# 183 passed

uv run ruff check <changed files>           # All checks passed
uv run ruff format --check <changed files>  # already formatted
```

## Risk

- [x] Backward compatibility considered

`json_schema_extra` is inert metadata: no change to validation,
serialization, or how
config.json is read/written. Existing configs load unchanged.

## Related Issues

Fixes EverMind-AI#84

Co-authored-by: Claude (claude-opus-4-8) <noreply@anthropic.com>
…d-AI#98)

## Summary

A non-ASCII PR body slipped onto main via EverMind-AI#97: the repo squash-merges
with
the PR description as the commit body, but nothing checked that body
before
merge, so an em-dash only tripped the post-merge commit lint on main
(too
late to fix cleanly). Close the gap at both the guidance and the
enforcement
layer.

- Enforcement (CI): add `check_pr_body` (ASCII-only, reusing
`commit_lint._is_ascii`) and a "Validate PR body" step in the
pull_request
job, so a non-ASCII PR body fails the PR check before merge and points
at
  the offending line.
- Guidance (AGENTS.md 3.7): the preview grep now uses `[^\x00-\x7F]`
(any
  non-ASCII), not a CJK-only pattern that gave a false pass.
- Guidance (AGENTS.md 3.1.1): state the punctuation rule is ASCII-only,
not
  merely no-full-width (calls out em-dash / curly quotes / ellipsis).

## Type

- [x] CI / tooling
- [x] Docs

## Verification

- [x] Relevant tests pass locally

```
uv run pytest tests/test_commit_lint.py -q                    # 12 passed
PR_BODY="line with a non-ascii dash" python3 scripts/check_pr_body.py  # exit 1, flags line
python3 scripts/check_commit_messages.py "origin/main..HEAD"  # PASS
grep -nP "[^\x00-\x7F]" <this body>                           # 0 matches
```

## Risk

- [x] Backward compatibility considered

The new check runs in the existing required pull_request job, so it is
enforced immediately without a new required-check name. ASCII-only PR
bodies
are already implied by the squash-to-main constraint, so this only moves
the
check earlier (pre-merge instead of post-merge).

## Related Issues

N/A (follow-up to the commit-lint failure on EverMind-AI#97)

---------

Co-authored-by: Claude (claude-opus-4-8) <noreply@anthropic.com>
…ns (EverMind-AI#99)

## Summary

`release.yml` only uploaded the built wheel to Actions artifacts, so a
pushed tag never produced a downloadable Release asset. `install.sh`
resolves the wheel from the latest Release asset, so a tag silently kept
serving the old version until someone manually created the Release and
attached the wheel. This builds a draft Release with the wheel and sdist
attached (cutting a release becomes one review plus a Publish click),
and documents the conventions in RELEASING.md.

- **release.yml**: on a version tag, create a draft GitHub Release with
the wheel + sdist attached, a dated title, and notes prefilled from a
template. Idempotent re-runs (list endpoint + delete a stale draft,
keeping the tag); prerelease tags (`vX.Y.Z-rcN`) stay out of
`/releases/latest`; the tag is guarded against the pyproject version;
adds `concurrency` and aligns action versions with ci/commits.
- **RELEASING.md** + **.github/release-notes-template.md**: the release
conventions and the CI notes skeleton.

Publishing stays a deliberate human step -- CI only creates the draft.

## Type

- [x] CI / tooling

## Verification

Local (macOS):

- `actionlint` (with shellcheck on the run blocks) clean on release.yml.
- YAML parses; the version/prerelease shell logic and template
substitution run correctly against the real pyproject and tag values.
- Idempotency detection verified against the live releases API
(published tag -> left alone; missing tag -> create).
- Not yet run end to end on a GitHub runner. Before the first stable
release, a `vX.Y.Z-rc1` tag will dry-run the full
draft/attach/idempotency path -- a prerelease never becomes
`/releases/latest`, so users are unaffected.

- [ ] Relevant tests pass locally
- [x] Relevant lint / type checks pass locally
- [x] User-facing docs or screenshots are updated when needed

## Risk

- [x] Security impact considered
- [x] Backward compatibility considered
- [x] Rollback path is clear for risky changes

The job gets `contents: write` (needed to create the Release). No
behavior change until a version tag is pushed; the workflow is dormant
otherwise. Rollback: revert the commit.

## Related Issues

N/A

Co-authored-by: Claude (claude-opus-4-8) <noreply@anthropic.com>
…nd-AI#94)

## Summary

Progressive tool disclosure previously exposed three meta-tools:
`tool_search`, `tool_describe`, and `tool_call`. `tool_describe` was a
separate
round-trip to fetch a hidden tool's parameter schema after
`tool_search`. This
PR collapses the flow to two meta-tools:

- **Drop `tool_describe`.** `tool_search` now returns each hit's
parameter
schema alongside its name and description, so the model can go straight
to
`tool_call`. When arguments don't fit the schema the registry already
returns
a correctable validation error, so the extra lookup step added no
correctness.
- **Index tool parameter schemas.** Parameter names, their descriptions,
and
enum values are folded into the BM25 index body (`name` x3 + description
+
schema keywords). Discriminating keywords often live in the schema
rather than
the one-line description (a repo owner, a channel id, an image size), so
indexing them lifts retrieval recall without changing the schema the
model
sees. The index signature now keys on `(name, description, parameters)`,
so a
  parameter change under hot-reload correctly triggers a rebuild.

Offline validation on the ToolRet benchmark (7,961 queries, 44k-tool
corpus,
Raven's own BM25 kernel) shows folding the schema into the index
consistently
lifts nDCG@10 by ~4-5 points over indexing name + description alone.

## Type

- [ ] Fix
- [ ] Feature
- [ ] Docs
- [ ] CI / tooling
- [x] Refactor
- [ ] Other

## Verification

```
uv run pytest tests/test_tool_search.py tests/test_agent_loop_tool_search.py -q
# 35 passed

uv run ruff check raven/agent/tools/tool_index.py raven/agent/tools/tool_search.py \
    raven/config/schema.py tests/test_tool_search.py tests/test_agent_loop_tool_search.py
# All checks passed!

uv run ruff format --check raven/agent/tools/tool_index.py raven/agent/tools/tool_search.py \
    tests/test_tool_search.py
# already formatted
```

New unit coverage: schema-keyword extraction (names, descriptions,
enums,
nesting, depth cap, non-dict input), rebuild-on-parameters-change,
search hits
carrying parameters, meta-tool set no longer including `tool_describe`.

- [x] Relevant tests pass locally
- [x] Relevant lint / type checks pass locally
- [ ] User-facing docs or screenshots are updated when needed

## Risk

- [x] Security impact considered
- [x] Backward compatibility considered
- [x] Rollback path is clear for risky changes

Progressive tool disclosure is opt-in (`tools.tool_search.enabled`
defaults to
false), so the default agent path is unaffected. `tool_describe` is an
internal
meta-tool with no public API; removing it changes only the
enabled-feature flow.
`tool_search` hits are larger now (they carry parameter schemas), but
only when
the model actively searches - the per-turn tool list and prompt-cache
prefix are
untouched. Rollback: revert the branch.

## Related Issues

N/A

---------

Co-authored-by: Claude (claude-opus-4-8) <noreply@anthropic.com>
EverMind-AI#102)

## Summary

Harden the `raven onboard` wizard, which reported false "connected"
results,
could trap or crash mid-flow, and billed silently in CI. One file
(`raven/cli/onboard_commands.py`) plus its tests; no schema/config
changes.

- Real verification instead of a connectivity check: memory LLM and
embedding
send a real `POST /chat/completions` / `/embeddings` probe (was `GET
/models`,
which greenlit models the endpoint doesn't serve); custom providers are
probed
too. Embedding takes the model id directly instead of showing a
misleading
chat-model list. A malformed base_url no longer crashes (catches
`InvalidURL`).
- No dead ends: test-message failure offers Re-enter key / Switch
provider; a
required EverOS role can give up EverOS (keep Markdown) instead of
looping;
the main-model empty submit uses the default instead of exiting; Ctrl+C
exits
  every menu; Step 1 requires at least one provider and a default model;
required channel fields re-prompt on empty; scancode reverts the enable
on any
  non-login exit.
- Config safety: a failed provider config is cleared or restored on
switch;
`_memory_enabled` requires both llm and embedding; key / URL / channel
inputs
  are stripped.
- `--skip-test` skips the billed test call (connectivity is still
checked); the
capability hint no longer renders like an error; `--reset` help and
setup
  warnings clarified.

## Type

- [x] Fix
- [ ] Feature
- [ ] Docs
- [ ] CI / tooling
- [ ] Refactor
- [ ] Other

## Verification

- `uv run pytest tests/test_cli_onboard_commands.py -q` -> 88 passed;
ruff
  check/format clean.
- Real DeepSeek: probes reject wrong / chat-only models (HTTP 400 / 404)
and
pass a valid one; `send_probe` returns a real reply and raises on a bad
model;
a malformed base_url returns no list without crashing; `--skip-test`
skips the
  chat call while a control run sends one.

- [x] Relevant tests pass locally
- [x] Relevant lint / type checks pass locally
- [ ] User-facing docs or screenshots are updated when needed

## Risk

- [x] Security impact considered
- [x] Backward compatibility considered
- [x] Rollback path is clear for risky changes

`--skip-test` defaults off, so non-interactive behavior is unchanged; no
schema/config changes; rollback is reverting the branch.

## Related Issues

Fixes EverMind-AI#81

---------

Co-authored-by: Claude (claude-opus-4-8) <noreply@anthropic.com>
…verMind-AI#101)

## Change description

DeepSeek thinking mode rejects a follow-up turn whose replayed assistant
message carried a tool call, with "reasoning_content must be passed back
to the API". The two history-projection allowlists dropped
`reasoning_content` / `thinking_blocks`, so the rebuilt assistant
history lost them.

Both keys are now preserved in `_history_from_messages` (Curator) and
`_ALLOWED_KEYS` (HistoryTrimmer); the provider gate still strips
`thinking_blocks` for non-Anthropic targets. The token estimators
(`estimate_prompt_tokens` / `estimate_message_tokens`) now count both
fields as well, so the preserved payload does not overflow the trim
budget on long multi-turn thinking chains.

## Type of change
- [x] Bug fix
- [ ] New feature
- [ ] Document
- [ ] Others

## Related issues

Fixes EverMind-AI#89

## Checklists

### Development

- [x] Lint rules pass locally
- [x] Application changes have been tested thoroughly
- [x] Automated tests covering modified code pass

### Security

- [x] Security impact of change has been considered
- [ ] Code follows security best practices and guidelines

### Code review

- [x] Pull request has a descriptive title and context useful to a
reviewer. Screenshots or screencasts are attached as necessary

Co-authored-by: Claude (claude-opus-4-8) <noreply@anthropic.com>
…ification (EverMind-AI#103)

## Change description

Upgrade EverOS from 1.0.1 to 1.1.2 and overhaul the onboard memory
configuration step with per-provider intelligence, model verification,
and UX improvements.

### EverOS 1.1.2 upgrade

- Bump `everos[multimodal]` from 1.0.1 to 1.1.2 in pyproject.toml
- Adapt to config file rename: `config.toml` -> `everos.toml`
- Switch env vars from `EVEROS_CONFIG_FILE` + `EVEROS_MEMORY__ROOT` to
single `EVEROS_ROOT`
- Handle exception class split: `MultimodalError` ->
`MultimodalNotEnabledError` + `UnsupportedModalityError`

### EverOS home initialization

- Add `ensure_everos_home()`: copies `everos.toml` + `ome.toml` from
shipped templates on first run, with legacy `config.toml` auto-migration
- Called from `make_backend`, `make_understand_media_tool`, and onboard
step 4

### LanceDB schema auto-migration

- Add `_migrate_lancedb_schemas()`: detects missing columns (e.g.
`deprecated_by`) and adds them via `pyarrow`
- `_acquire_embedded_everos()` catches `LanceDBSchemaMismatchError`,
runs migration, retries lifespan
- Eliminates the need for users to manually clear and rebuild LanceDB
indexes on upgrade

### Per-provider model fetching

- Expand `_EVEROS_PROVIDERS` to 6 entries (add DeepInfra) with
`supports` capability sets and `rerank_provider`/`rerank_base_url`
fields
- Provider-specific model listing APIs:
- OpenRouter: `/embeddings/models` for embed,
`?output_modalities=rerank` for rerank, `?input_modalities=image` for
multimodal
- DeepInfra: `/models/list` with `reported_type` filter (shared
`_fetch_deepinfra_models` helper)
  - SiliconFlow: query params `sub_type=embedding` / `sub_type=reranker`
  - DashScope: fixed rerank list `["gte-rerank-v2"]`
- Only show providers that support the current role (e.g. DeepSeek
excluded from embedding choices)

### Per-role model verification

- LLM: real `POST /chat/completions` probe (from PR EverMind-AI#102)
- Embedding: two-step MRL dimension probe -- try `dimensions=1024`
first, fall back to native dim check; reject models that cannot produce
1024-dim vectors
- Rerank: provider-specific probe dispatching to vllm (`/rerank`),
deepinfra (`/{model}`), or dashscope
(`/api/v1/services/rerank/text-rerank/text-rerank`)
- Multimodal: `POST /chat/completions` probe
- Each verifier is a peer-level function dispatched by section in
`_config_everos_role`

### Onboard UX improvements

- Model recommendations displayed after fetching model list
(gpt-4.1-mini / Qwen3-Embedding-4B / Qwen3-Reranker-4B /
gemini-3-flash-preview)
- Immediate autocomplete popup via `prompt_toolkit` `pre_run_callables`
- Default-select LLM provider for embed/rerank/multimodal steps with
auto API key reuse
- Auto-resolve rerank service type from provider dict (no manual
selection)
- Wording: "Disable" -> "Skip", "dimension correct" -> "supports
1024-dim"
- Multimodal purpose text alignment

### Integration test isolation

- Set `EVEROS_ROOT` to tmp_path in test fixtures and e2e subprocess env
- Copy `everos.toml` + `ome.toml` from real root before redirect
- Reset `_embedded_lifespan_cm` and `_embedded_lifespan_refs` between
tests

## Type of change
- [x] Bug fix
- [x] New feature
- [ ] Document
- [ ] Others

## Related issues (if there is)

Depends on PR EverMind-AI#102 (merged)

## Checklists

### Development

- [x] Lint rules pass locally
- [x] Application changes have been tested thoroughly
- [x] Automated tests covering modified code pass

### Security

- [x] Security impact of change has been considered
- [x] Code follows security best practices and guidelines

### Code review

- [x] Pull request has a descriptive title and context useful to a
reviewer. Screenshots or screencasts are attached as necessary

Co-authored-by: Claude (claude-opus-4-6) <noreply@anthropic.com>

---------

Co-authored-by: Jiayao Song <jiayao.song@shanda.com>
Co-authored-by: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
…-AI#105)

## Change description

The TUI `/model` picker showed an empty model list for direct providers
(DeepSeek, OpenAI, Anthropic, Gemini, Zhipu, Groq, DashScope): their
config
`models` default to `[]` and `COMMON_MODELS` seeded only openrouter, so
the
curated fallback the picker reads was empty.

This seeds a curated, chat-only shortlist for each of those providers,
refreshes the openrouter shortlist from real usage rankings, and gives
each
seeded provider a non-empty `default_model`:

- deepseek moves off the soon-deprecated `deepseek-chat` (its official
  successor is `deepseek-v4-flash`, same economy tier);
- zhipu, dashscope and groq previously had no `default_model` at all;
- openai and anthropic move to current-generation flagships.

Model ids were verified against litellm 1.85.0, provider docs, and
OpenRouter
usage data, not guessed. Live dynamic model fetching (hermes-style
per-provider
`/v1/models`) was evaluated and deferred as a separate follow-up:
litellm gives
no clean live catalog for the direct providers, so it does not solve
this case.

Note: unauthenticated providers now also surface the curated shortlist
in the
picker, consistent with openrouter's existing behavior; the auth state
is
conveyed separately.

## Type of change
- [ ] Bug fix
- [x] New feature
- [ ] Document
- [ ] Others

## Related issues

Fixes EverMind-AI#100

## Checklists

### Development

- [x] Lint rules pass locally
- [x] Application changes have been tested thoroughly
- [x] Automated tests covering modified code pass

### Security

- [x] Security impact of change has been considered
- [ ] Code follows security best practices and guidelines

### Code review

- [x] Pull request has a descriptive title and context useful to a
reviewer. Screenshots or screencasts are attached as necessary

Co-authored-by: Claude (claude-opus-4-8) <noreply@anthropic.com>
## Summary

Prepare Raven 0.1.3 by updating the package version, runtime version,
and lockfile project entry from 0.1.2 to 0.1.3.

After this change is merged, a `v0.1.3` tag can pass the release
workflow version guard and create a draft GitHub Release with wheel and
source distribution assets. This pull request does not create a tag or
publish a release.

### Proposed release notes

Raven 0.1.3 makes setup and TUI use more dependable with working EverOS
memory, verified model onboarding, curated model choices, and stronger
session reliability.

#### Highlights

- EverOS memory now works out of the box in the TUI, with managed
embedded-backend startup and shutdown.
- `raven onboard` now verifies real chat, embedding, rerank, and
multimodal requests, offers safer recovery paths, and upgrades EverOS to
1.1.2 with automatic first-run config and LanceDB schema migration.
- The TUI `/model` picker now includes curated choices for OpenRouter
and the DeepSeek, OpenAI, Anthropic, Gemini, Zhipu, Groq, and DashScope
direct providers.
- Large tool catalogs can opt into progressive tool disclosure, keeping
per-turn tool payloads bounded while models search and call hidden tools
on demand.
- Subagent results now return to the session that launched them, and
repeated spawns no longer leak skill file watchers.
- Cancelling a streamed TUI turn now keeps partial assistant output in
the transcript, and CLI shutdown avoids a LanceDB-related exit crash.
- Thinking-mode conversations now preserve reasoning fields across
trimmed history, fixing DeepSeek follow-up turns that include tool
calls.
- Standard macOS, Linux, and Windows installers now include channel SDKs
by default and show install-mode-aware recovery guidance for missing
dependencies.

#### Install

```bash
curl -fsSL https://raven.evermind.ai/install.sh | bash
```

Then reload your shell and run:

```bash
raven onboard
```

#### Release status

- Version: `0.1.3`
- Tag: `v0.1.3`
- Stability: public preview patch
- Assets: wheel and source distribution attached to the release

#### Notes

- Raven is still pre-1.0; CLI surfaces, plugin contracts, and runtime
internals may continue to evolve.
- PyPI publishing is not enabled yet; the supported public install path
uses the GitHub Release wheel asset.

## Type

- [ ] Fix
- [ ] Feature
- [ ] Docs
- [ ] CI / tooling
- [ ] Refactor
- [x] Other

## Verification

- `uv lock --check`
- Version consistency check confirms `pyproject.toml`,
`raven.__version__`, and `uv.lock` use `0.1.3`.
- `git diff --check`
- The full test suite is not marked passing: the local baseline includes
environment-dependent EverOS integration failures and unrelated
host-state failures.

- [ ] Relevant tests pass locally
- [ ] Relevant lint / type checks pass locally
- [x] User-facing docs or screenshots are updated when needed

## Risk

- [x] Security impact considered
- [x] Backward compatibility considered
- [x] Rollback path is clear for risky changes

This is a metadata-only version bump. Rollback is a revert before
tagging.

## Related Issues

N/A
## Summary

- Always start the interactive Codex OAuth flow when the user explicitly
selects OAuth login, even when a cached token exists.
- Upgrade `oauth-cli-kit` from 0.1.3 to 0.1.6 for headless browser
detection and manual callback fallback.
- Pass Raven's Linux graphical-session detection into the OAuth login
flow.
- Add regression coverage for cached-token reauthentication and headless
Linux sessions.

The login handler previously read a cached Codex token before starting
OAuth. When that token was valid, Raven skipped
`login_oauth_interactive()` entirely, so selecting Codex OAuth during
onboarding did not open a browser. The handler now treats an explicit
login action as a request to authenticate interactively and launches the
browser flow every time.

Headless Linux sessions still use the manual authorization URL and
redirect-URL prompt instead of waiting for a browser callback that
cannot arrive.

## Type

- [x] Fix
- [ ] Feature
- [ ] Docs
- [ ] CI / tooling
- [ ] Refactor
- [ ] Other

## Verification

- `uv run pytest tests/test_cli_provider_commands.py
tests/test_cli_onboard_commands.py -q` (`87 passed`)
- `uv run pre-commit run --files pyproject.toml
raven/cli/provider_commands.py tests/test_cli_provider_commands.py
uv.lock`
- `make lint-python && make test-python` (`18 passed`)
- Local commit-message and PR-title lint scripts
- Manual macOS verification through `raven onboard`: selecting `Codex
(OAuth)` opened the OpenAI authorization page in the default browser
with an existing cached token. The flow was cancelled before account
authorization.

- [x] Relevant tests pass locally
- [x] Relevant lint / type checks pass locally
- [ ] User-facing docs or screenshots are updated when needed

## Risk

- [x] Security impact considered
- [x] Backward compatibility considered
- [x] Rollback path is clear for risky changes

Normal provider usage continues to reuse stored OAuth credentials. Only
an explicit login action now forces the interactive authorization flow.

## Related Issues

Fixes EverMind-AI#108
## Summary

- Add `raven upgrade --check` and `raven upgrade` for the latest stable
GitHub Release wheel.
- Reject editable and unsupported installs, validate release and
installation metadata, target the active uv tool directories, and
preserve all state under `~/.raven`.
- Keep POSIX replacement synchronous. On Windows, launch a
whitespace-safe external helper, wait for the uv trampoline to exit, and
then replace the unlocked tool.
- Add a real uv self-upgrade integration test on Windows, block upgrades
inside the active TUI, and document the manual user workflow in both
READMEs.

Windows returns after scheduling the helper because the running
`raven.exe` must exit before uv can replace it. Users must wait for the
helper completion message before running Raven again.

## Type

- [ ] Fix
- [x] Feature
- [x] Docs
- [x] CI / tooling
- [ ] Refactor
- [ ] Other

## Verification

- `uv run pytest tests/test_cli_upgrade_commands.py
tests/integration/test_cli_upgrade_real_uv.py tests/test_cli_smoke.py
tests/test_tui_rpc_cli_dispatch.py
tests/test_tui_rpc_commands_catalog.py -q` - 187 passed
- `uv run ruff check raven/cli/upgrade_commands.py raven/cli/commands.py
raven/tui_rpc/methods/cli_dispatch.py tests/test_cli_upgrade_commands.py
tests/integration/test_cli_upgrade_real_uv.py tests/test_cli_smoke.py
tests/test_tui_rpc_cli_dispatch.py` - passed
- `uv run ruff format --check raven/cli/upgrade_commands.py
raven/cli/commands.py raven/tui_rpc/methods/cli_dispatch.py
tests/test_cli_upgrade_commands.py
tests/integration/test_cli_upgrade_real_uv.py tests/test_cli_smoke.py
tests/test_tui_rpc_cli_dispatch.py` - passed
- `npm test --prefix ui-tui -- src/__tests__/branding.test.tsx` - 13
passed
- `npm run lint --prefix ui-tui` - passed with 0 errors and 22 existing
warnings
- `npm run lint:rpc --prefix ui-tui && npm run type-check --prefix
ui-tui` - passed
- `make check-commits && PR_TITLE='feat(cli): add raven upgrade command'
make check-pr-title && make check-large-files` - passed
- Native Windows end-to-end confirmation is provided by the `Windows
self-upgrade` PR check.

- [x] Relevant tests pass locally
- [x] Relevant lint / type checks pass locally
- [x] User-facing docs or screenshots are updated when needed

## Risk

- [x] Security impact considered
- [x] Backward compatibility considered
- [x] Rollback path is clear for risky changes

## Related Issues

Closes EverMind-AI#111
…port (EverMind-AI#92)

File-based USER/PROJECT plugins ship their factory module inside the
plugin directory (~/.raven/plugins/<id>/), which nothing put on
sys.path. Discovery found the manifest but _resolve_factory's bare
importlib.import_module always failed — a self-contained plugin dropped
into the user dir could never load.

activate() now threads each DiscoveredPlugin's source and location into
_activate_one, which calls _ensure_importable before resolving
factories: for USER/PROJECT plugins it appends (not prepends, so
installed packages keep priority) the plugin directory to sys.path,
guarded for idempotency. BUNDLED (in-package) and ENTRY_POINTS
(installed) are untouched.

Add regression tests that write real on-disk factory packages (not
pre-seeded into sys.modules) under user/project dirs and assert the
backend/tool build end to end.

## Summary

<!-- What changed, and why? -->

## Type

- [ ] Fix
- [ ] Feature
- [ ] Docs
- [ ] CI / tooling
- [ ] Refactor
- [ ] Other

## Verification

<!-- List the exact commands you ran and the result. -->

- [ ] Relevant tests pass locally
- [ ] Relevant lint / type checks pass locally
- [ ] User-facing docs or screenshots are updated when needed

## Risk

- [ ] Security impact considered
- [ ] Backward compatibility considered
- [ ] Rollback path is clear for risky changes

Co-authored-by: libin.zhang <libin.zhang@shanda.com>
## Change description

Fixes a fresh-install crash where every real turn fails with
`APIConnectionError: OpenrouterException - No module named 'orjson'`
(shown in the TUI as the generic `turn_failed (code=-32099)`).

Root cause: litellm's request path imports `orjson` at runtime, but
litellm
only declares it under its `proxy` extra, which raven does not install.
So
`orjson` was absent from raven's dependency graph entirely (not in
`pyproject.toml`, not in `uv.lock`). Any install (`git clone && uv
sync`, or
the release wheel) therefore lacked it, and the first message a user
sends
crashes the turn.

Fix: declare `orjson` as a direct runtime dependency so every install
resolves it.

Verified locally: a turn that previously failed with the missing-orjson
error now completes normally after the dependency is declared.

## Type of change
- [x] Bug fix
- [ ] New feature
- [ ] Document
- [ ] Others

## Related issues

Closes EverMind-AI#113

## Checklists

### Development
- [x] Lint rules pass locally
- [x] Application changes have been tested thoroughly
- [ ] Automated tests covering modified code pass

### Security
- [x] Security impact of change has been considered
- [x] Code follows security best practices and guidelines

### Code review
- [x] Pull request has a descriptive title and context useful to a
reviewer

Co-authored-by: Claude Opus 4.8 <noreply@anthropic.com>
## Summary

Bump project version 0.1.3 -> 0.1.4 to cut the next patch release. Ships
the four fixes/features merged since v0.1.3: `raven upgrade` command
(EverMind-AI#112), onboard oauth browser login (EverMind-AI#110), plugin dir on sys.path
(EverMind-AI#92), and orjson as a direct dependency (EverMind-AI#116). Lockfile synced via `uv
lock`.

## Type

- [ ] Fix
- [ ] Feature
- [ ] Docs
- [ ] CI / tooling
- [ ] Refactor
- [x] Other

## Verification

- [x] Relevant lint / type checks pass locally

```
python3 scripts/check_commit_messages.py origin/main..HEAD   # pass
uv lock                                                       # raven 0.1.3 -> 0.1.4
```

## Risk

- [x] Backward compatibility considered

Version-only bump; no runtime code changed. The release tag (v0.1.4) is
pushed after this merges.

## Related Issues

N/A

Co-authored-by: Claude (claude-opus-4-8) <noreply@anthropic.com>
…act (EverMind-AI#135)

## Summary

Add an in-tree tracing subsystem and adopt it across raven, giving every
run
a structured `audit.span.v1` trace (turn -> model / tool / memory /
skill /
subagent) viewable in a bundled dashboard.

The design keeps raven and tracing decoupled so they can iterate
independently,
coupled only by a small contract:

- **tracing owns the standard.** `raven/tracing` exposes a thin facade
(`trace.span` / `@trace.instrument`) over an `audit.span.v1` record
format,
a set of semantic conventions, and a dependency-free Node viewer. Custom
nodes are supported with no registration (any owned `<domain>.<verb>`
name).
- **raven adopts it as a pure consumer.** Instrumentation is one import
+ one
`@trace.instrument` decorator per method; **method bodies are
untouched**.
Purposes self-nest via contextvars, so a model call under `skill.gate`,
`memory.extract`, `subagent.run`, etc. is distinguished by its parent
node
  and by a derived `llm.invocation_source` (nearest non-model ancestor).
- **tracing can never break raven.** The facade is no-op when disabled
(`[tracing]` config or `RAVEN_TRACING=0`) and swallows its own failures
while
  re-raising the application's exception unchanged.

Open the dashboard with `raven tracing` (or `/tracing` in the TUI).

Key node behavior: all skill pulls (`use_skill` / `read_skill` / a
`read_file`
of a SKILL.md) unify into one `skill.read` node, differentiated by
content
(`skill.read.via_tool`, and `skill.scripts_dir` when a runnable bundle
was
materialized) rather than by tool name.

## Type

- [x] Feature

## Verification

- [x] Relevant tests pass locally
- [x] Relevant lint / type checks pass locally
- [x] User-facing docs or screenshots are updated when needed

Commands run:

- `uv run pytest tests/test_tracing_api.py -q` -> 20 passed (nesting,
kinds,
  attributes, artifacts, retype, invocation_source, and the frozen
  contract + non-interference gates).
- `uv run pytest tests/ -q` -> 4091 passed, 85 failed, 12 errors. The
failures
are pre-existing and unrelated: an identical run with `RAVEN_TRACING=0`
(this
change fully inert) produces the byte-identical failing set, so this
change
adds zero failures. The failures are environment-only (TUI subprocess
e2e,
EverOS real-LLM, sandbox VM, npx MCP) plus a pre-existing async-mock
ordering
  issue in the sentinel/attention suite (passes in isolation).
- `uv run ruff check` / `uv run ruff format` -> clean.
- Verified at runtime: raven core diff is annotation-only (each touched
file is
+2 lines: one import, one decorator); disabled pass-through and
internal-
  failure isolation confirmed by dedicated tests.

## Risk

- [x] Security impact considered
- [x] Backward compatibility considered
- [x] Rollback path is clear for risky changes

Backward compatibility: additive only. No existing behavior changes;
tracing is
observation-only and defaults can be turned off with `RAVEN_TRACING=0`.
Rollback: revert the branch, or disable via config; raven runs
identically
without it. Note: `raven/tracing/instrument.py` monkeypatch path is
gone; all
instrumentation is explicit decorators in raven's own source.

Coverage note: the personalizer's four steps (which call `provider.chat`
directly) are instrumented as `personalize.*` purpose spans, so no model
activity is untraced. The only remaining follow-up is the standalone-OSS
extraction (import-optional shim, move raven-specific extractors out,
drop raven
branding) -- a planned separate phase that ships tracing as its own
package,
out of scope for this PR.

## Related Issues

N/A

---------

Co-authored-by: Claude (claude-opus-4-8) <noreply@anthropic.com>
## Summary

Integrate MiroThinker as an async `deep_research` tool, end to end.

- **Tool + streaming** (`feat(agent)`): add the `deep_research` tool
with CLI/TUI streaming.
- **Async channel delivery** (`feat(agent)`): a `deliver_text` turn
primitive delivers the research result to channels verbatim
(out-of-band), since a MiroThinker run is minute-scale and must not
block the turn.
- **CLI config + onboard** (`feat(cli)`): `raven deep-research
enable/get/reset` plus an onboard step so users configure the tool
without hand-editing `config.json`. Key validation uses the free `GET
/v1/models` probe (a `/chat/completions` ping would trigger a full
billed research run).
- **Config write-safety fix** (`fix(config)`): every config-write
command shared a raw reader that swallowed a JSON parse error and
returned `{}`, so writing over a present-but-unparseable `config.json`
(e.g. one with `//` comments) wiped the whole file down to just the
command's own section. Found while testing `deep-research enable` on a
real config. A single shared `read_raw_or_raise` now raises
`ConfigReadError` for a present-but-unparseable file; all six raw
read-modify-write points converge on it, and the CLI surfaces it once,
cleanly, leaving the file untouched.

## Type

- [x] Feature

## Verification

- `uv run pytest` (config layer + deep-research/onboard/provider CLI +
tui_rpc config + cli smoke): **340 passed**.
- `uv run ruff check` on all touched files: clean.
- Real-machine (isolated): async `deep_research` result delivered to a
WeChat channel verbatim; onboard step walked; `deep-research enable`
against a malformed `config.json` refuses with a friendly message and
leaves the file byte-identical (verified with `cmp`).

- [x] Relevant tests pass locally
- [x] Relevant lint / type checks pass locally
- [ ] User-facing docs or screenshots are updated when needed

## Risk

- [x] Security impact considered
- [x] Backward compatibility considered
- [x] Rollback path is clear for risky changes

## Related Issues

N/A

---

Reviewer notes:
- Mixed-topic PR on purpose: it is a `feat` (deep_research) that also
carries the `fix(config)` bug it exposed; the squash commit takes the
`feat(agent)` title and GitHub collects both `Co-authored-by` trailers.
- Full `uv run pytest` still shows env-dependent failures (sandbox VM,
TUI Ink/Node E2E, missing channel SDKs) that predate this branch; the
tests covering the code changed here (340) pass. A base comparison to
confirm none are new is still pending.
- The MiroThinker test key used for real-machine checks is isolated and
is not committed anywhere in this branch.

---------

Co-authored-by: Claude (claude-opus-4-8) <noreply@anthropic.com>
## Summary

Bump version from 0.1.4 to 0.1.5 for release. Two feature PRs landed on
main since v0.1.4:

- EverMind-AI#136 feat(agent): integrate mirothinker deep_research tool
- EverMind-AI#135 feat(tracing): in-tree tracing subsystem with decoupled adopter
contract

Only pyproject.toml and uv.lock change (version field synced via `uv
lock`).

## Type

- [ ] Fix
- [ ] Feature
- [ ] Docs
- [ ] CI / tooling
- [ ] Refactor
- [x] Other

## Verification

- [x] Relevant lint / type checks pass locally

Ran `uv lock` to sync the lockfile; commit-message lint passes
(`check_commit_messages.py`).

## Risk

- [x] Backward compatibility considered

Version-only bump; no source changes.

## Related Issues

N/A

Co-authored-by: Claude (claude-opus-4-8) <noreply@anthropic.com>
)

## Change description

`raven --version` printed a stale `0.1.3` even after the release bump to
`0.1.5`. The root cause: `raven/__init__.py` carried a hand-written
`__version__` literal that the release flow (which edits only
`pyproject.toml`, per `RELEASING.md`) never updated -- a hidden second
source of truth.

This derives `__version__` from installed package metadata
(`importlib.metadata.version("raven")`, with a `PackageNotFoundError`
fallback), matching the existing in-repo pattern in
`cli/upgrade_commands._current_version` and
`tui_rpc/methods/system._raven_version`. Now `raven --version`, the TUI
intro banner, and `pyproject.toml` all resolve to a single source of
truth through the installed dist-info.

Added `test_version_flag_matches_installed_metadata` to
`tests/test_cli_smoke.py`, asserting the flag output equals the
installed metadata version (not a pinned literal, so it can never
re-introduce drift).

Out of scope: the slow `raven --version` startup (litellm eager import)
is a separate, pre-existing perf concern tracked alongside EverMind-AI#128, not
addressed here.

## Type of change
- [x] Bug fix
- [ ] New feature
- [ ] Document
- [ ] Others

## Related issues (if there is)

Fixes EverMind-AI#138

## Checklists

### Development

- [ ] Lint rules pass locally
- [x] Application changes have been tested thoroughly
- [x] Automated tests covering modified code pass

### Security

- [x] Security impact of change has been considered
- [ ] Code follows security best practices and guidelines

### Code review

- [x] Pull request has a descriptive title and context useful to a
reviewer. Screenshots or screencasts are attached as necessary

Co-authored-by: Claude (claude-opus-4-8) <noreply@anthropic.com>
…EverMind-AI#141)

## Summary

Harden `raven tracing` so it never opens the browser onto a "Not found"
page.

The launcher treated *any* listener on the dashboard port as its own
running
viewer: `_open_dashboard` only checked whether the TCP port was live,
then
pointed the browser at it. A stale viewer from an older on-disk layout
(its
`index.html` was later replaced by an inlined `shell.js`) -- or an
unrelated
server -- holding that port answered every request with `404 Not found`,
so
`/tracing` opened a broken page.

Fix: probe `GET /api/health` before reusing a live port.

- Reuse the port only when it answers `{"ok": true}` (our viewer's
signature; a
  foreign or stale server does not).
- If the port is held by something else, start the viewer on the next
free port
  instead of clashing (or error clearly if none is free nearby).
- Readiness now waits on `/api/health` succeeding rather than a bare TCP
  connect, so we only open the browser once the viewer actually serves.

## Type

- [x] Fix

## Verification

- [x] Relevant tests pass locally
- [x] Relevant lint / type checks pass locally

Commands run:

- `uv run pytest tests/test_cli_tracing_commands.py -q` -> 4 passed
(health false when nothing listening / false for a foreign 404 server /
true
  for our viewer / free-port scan skips an occupied port).
- `uv run ruff check raven/cli/tracing_commands.py
tests/test_cli_tracing_commands.py` -> clean.
- Reproduced the original bug on a real machine: a stale viewer process
held
4318 and returned `404 Not found` for `/`; with this change the launcher
  detects it is not our viewer and moves to a free port.

## Risk

- [x] Security impact considered
- [x] Backward compatibility considered

Backward-compatible: same behavior when the port is free or already
hosts our
viewer; only the "foreign process on the port" case changes (previously
a broken
page, now a working viewer on another port). No API or schema change.

## Related Issues

N/A -- follow-up hardening on the tracing viewer merged in EverMind-AI#135.

Co-authored-by: Claude (claude-opus-4-8) <noreply@anthropic.com>
## Summary

Every `raven` command imported litellm eagerly, and litellm was ~85% of
the
~2.35s cold start -- so even `raven --version` paid the full tax. This
defers
litellm to the code paths that actually need a model:

- Drop the top-level `import litellm` in the CLI entry module.
- Make `raven.agent` and `raven.providers` PEP 562 lazy re-exports, so
importing
a submodule no longer eagerly constructs `AgentLoop` -> litellm (0
in-repo
  callers of the re-exports, so no behavior change).
- Route every litellm import through a single `import_litellm()` helper
that
silences litellm's "Provider List" banner and suppresses its import-time
DEBUG
from the terminal (litellm installs its own stderr handler and logs
while
importing; the deferred import happens after raven's CLI logging setup,
so the
  helper keeps that noise off the terminal / Ink TUI).

Result: `raven --version` starts in ~0.4s (from ~2.35s). Verified the
everos
memory substrate was never on the startup path; it was not the
bottleneck.

## Type

- [ ] Fix
- [ ] Feature
- [ ] Docs
- [ ] CI / tooling
- [ ] Refactor
- [x] Other

## Verification

- `raven --version`: ~2.35s -> ~0.4s (direct `.venv/bin/raven`).
- `python -X importtime -c "import raven.cli.commands"`: 0 litellm.
- Real logging path (`redirect_loguru_to_file` + provider import) and an
interactive `raven tui`: 0 `LiteLLM:DEBUG` lines leaked to the terminal.
- `make test-python` (now includes `test_cli_smoke.py` +
`test_litellm_setup.py`).
- Affected suites (agent loop / providers / token_wise / tui logging
isolation): pass.

- [x] Relevant tests pass locally
- [x] Relevant lint / type checks pass locally
- [ ] User-facing docs or screenshots are updated when needed

## Risk

- [x] Security impact considered
- [x] Backward compatibility considered
- [ ] Rollback path is clear for risky changes

## Related Issues

Fixes EverMind-AI#142

Co-authored-by: Claude (claude-opus-4-8) <noreply@anthropic.com>
…EverMind-AI#140)

## Summary

Port the harness self-evolution framework onto Raven and grow it into a
runnable, benchmark-pluggable stack: a budget-bounded loop that
diagnoses
failing trajectories, designs candidate patches as real git commits,
screens
them cheaply, confirms survivors, and promotes only what passes three
verification gates -- with a sealed test set for an honest
generalisation
number.

- **Evolution machinery** (`raven/evolver/`): orchestrator state machine
  (seven-step funnel), three verification gates (infra validity, beacon
  attribution, paired significance), sealed-test runner with retention,
  git-backed candidate tree, judge, taxonomy, activation ledger.
- **AppWorld bench** (`benchmarks/appworld/`): agent_cli, batch scorer
with trial-level resume and an infra-rerun ladder, plus the evolve glue
(designer, diagnosis, adapter, Gate0 precheck with real-generation
probing).
- **Unified entry**: `python -m raven.evolver
{check,run,status,finalize}`
drives cold start -> rounds -> terminate -> unseal as a resumable state
machine. Config drift and unseal one-wayness are mechanized in run meta;
benches plug in via a documented contract
(`docs/specs/evolve-bench-contract.md`).
- **Designer feedback**: inert-death loop (pruned_inert status, per-WHY
  history, gentle decay) so unreachable triggers teach the next attempt.
- **Launch hygiene**: `check` runs the bench Gate0 precheck, so a dead
subject endpoint fails at check time instead of at cold start; ephemeral
eval/edit worktrees live under `work_dir/tmp` and hard-kill leftovers
are
  swept on the next launch of the same run.
- **Docs**: SOP translation (internal details redacted), SOP-to-code
map,
  bench plugin contract, and a user README with security notes and known
  limitations.

## Type

- [ ] Fix
- [x] Feature
- [ ] Docs
- [ ] CI / tooling
- [ ] Refactor
- [ ] Other

## Verification

- [x] Relevant tests pass locally
- [x] Relevant lint / type checks pass locally
- [x] User-facing docs or screenshots are updated when needed

Commands run:

- `uv run pytest tests/test_evolver_launch.py
tests/test_evolver_launch_e2e.py -q`
-> 56 passed (config, guards, trial-level idempotency, interrupt ->
resume ->
  finalize with a fake bench, check precheck pass/fail, worktree sweep).
- `uv run ruff check` on all touched files -> no new findings versus
base
  (one S607 partial-path git call matching the file's existing idiom).
- Real AppWorld end-to-end through the unified entry, from a fresh
config
written by following the README user path: `check` -> `run --smoke` (~16
min:
cold start on 3 tasks, one full round with real diagnose/design, a real
1-line candidate commit, focused probe + confirm, promoted with an
honest
  `credited=False` Gate-b verdict) -> termination.
- Real `check` both ways: live subject endpoint -> `bench precheck: OK`;
config pointed at a dead (NXDOMAIN) endpoint -> exit 1 at check time
with
  an actionable `subject endpoint unreachable` message.
- The bench placement (repo-root `benchmarks/`, outside the wheel,
matching
this directory's decoupling convention) was verified with a second real
smoke: all three phases ran against a checkout of this layout, worktree
evals resolved `python -m benchmarks.appworld.batch` from the checkout,
  and the designer wrote its candidate to the new whitelist path
  (`benchmarks/appworld/agent_cli.py`) as a real commit.

## Risk

- [x] Security impact considered
- [x] Backward compatibility considered
- [x] Rollback path is clear for risky changes

Security: this system has an LLM edit and execute code. Candidate edits
are
constrained to a per-bench path whitelist, an immutable kernel protects
the
measurement surface (the evolver itself and the scorer), and the README
documents the threat model plus the recommendation to run evolutions in
an
isolated environment. Backward compatibility: purely additive -- new
packages
plus one optional `BenchBundle.precheck` field; nothing existing changes
behavior. Rollback: revert the branch; no migrations, no config changes
to
existing features.

## Related Issues

N/A

---

Reviewer notes:

- Exercised at smoke scale only: a full-size run (90 tasks x K=3,
multi-round,
hours) and the sealed-test unseal/retention path on a real benchmark are
covered by tests but not yet by a production run; the README states this
  under "Status and known limitations".
- One bench ships today (AppWorld, built-in scorer line); a
framework-line
  example (external scorer) is planned as a follow-up.

---------

Co-authored-by: Ethan Wang <ethan.wang@evermind.ai>
Co-authored-by: Claude (claude-fable-5) <noreply@anthropic.com>
Co-authored-by: Elliot Chen <2340896+cyfyifanchen@users.noreply.github.com>
…d-AI#157)

## Summary

Profiling `raven tui` bring-up put the agent-loop build
(`_build_tui_agent_loop`) at ~7s, so the TUI showed an empty shell
for several seconds before real content (issue EverMind-AI#128 reports it as a
4-5s delay). Two eager imports on that path dominated: litellm when
the loop built its provider, and the everos/lancedb memory backend
(its `start()` measured ~2.5s). Deferring both off the render path
drops the build to ~1.8s -- the diffuse-import residual -- and a
startup loader fills what remains.

- `perf`: `LazyProvider` defers litellm to the first chat (with a
  background prewarm); `EverosBackend` defers its adapter import into
  `start()`, which the TUI runs in the background after the render
  handshake. recall/store degrade to empty until the backend is ready.
  A cheap credential check keeps startup fail-fast without importing
  litellm.
- `feat(tui)`: a `StartupLoader` (braille spinner in the SessionPanel
  box) fills the pre-handshake gap and is replaced by the real panel
  the moment `session.info` arrives.

The empty-shell window drops from ~7s to ~1-2s, with real tool/skill
counts and no `-32008` on the first send.

Non-blocking trade-offs (documented, not bugs): the residual ~1.8s is
diffuse imports with no single lever; quitting within the first ~2.5s
waits briefly on the background backend task; a first message sent
within ~2.5s runs one turn without memory recall (silent degrade).
Phase-timing startup logs (one of the issue's acceptance items) were
not added -- the delay was root-fixed rather than instrumented.

Also reformats `useMainApp.ts` (a pre-existing drift from EverMind-AI#80) so the
whole-tree prettier hook passes on this first ui-tui change since.

## Type

- [x] Fix
- [x] Feature

## Verification

- [x] Relevant tests pass locally
- [x] Relevant lint / type checks pass locally

Commands: `make lint-python`, `make test-python`, and
`cd ui-tui && npm run lint && npm run type-check && npm test && npm run
build`.

## Risk

- [x] Backward compatibility considered

Provider swap on model change still works (the loop holds a plain
assignable provider attribute). agent/gateway paths keep
`make_provider`;
only the TUI uses the lazy path.

## Related Issues

Fixes EverMind-AI#128

---------

Co-authored-by: Claude (claude-opus-4-8) <noreply@anthropic.com>
## Summary

Bump Raven package metadata from 0.1.5 to 0.1.6 so the release tag can
build a wheel from the current main branch.

This release carries the changes merged after v0.1.5:

- Version display now derives from installed package metadata (EverMind-AI#139).
- Tracing dashboard port reuse avoids taking over non-Raven viewers
(EverMind-AI#141).
- CLI startup defers LiteLLM imports for faster cold start (EverMind-AI#147).
- Self-evolution stack and AppWorld benchmark entry points are included
(EverMind-AI#140).
- TUI render delay is reduced by deferring provider and memory loading
(EverMind-AI#157).

## Type

- [ ] Fix
- [ ] Feature
- [ ] Docs
- [ ] CI / tooling
- [ ] Refactor
- [x] Other

## Verification

- [x] Relevant tests pass locally
- [x] Relevant lint / type checks pass locally
- [ ] User-facing docs or screenshots are updated when needed

Commands run:

- `PYTHONPATH=. uv run pytest
tests/test_cli_smoke.py::test_version_flag_matches_installed_metadata
-q`
- `make check-commits COMMIT_RANGE=origin/main..HEAD`
- `PYTHONPATH=. uv run python scripts/check_commit_file.py
/tmp/raven-commit-msg.txt`

No user-facing docs or screenshots were needed for this version metadata
bump; release notes will be published with the GitHub Release.

## Risk

- [x] Security impact considered
- [x] Backward compatibility considered
- [x] Rollback path is clear for risky changes

This changes package metadata only. Rollback is to delete the v0.1.6
tag/release if publication fails before users upgrade, or publish a
follow-up patch release if a released package issue is found.

## Related Issues

N/A
## Summary

Update the root README so the latest public surfaces are visible without
changing the existing structure.

The README now mentions:

- Deep Research setup through `raven deep-research enable`.
- The tracing dashboard through `raven tracing`.
- The existing evolver pipeline in the architecture and status sections.
- The related command and documentation entry points.

## Type

- [ ] Fix
- [ ] Feature
- [x] Docs
- [ ] CI / tooling
- [ ] Refactor
- [ ] Other

## Verification

- [ ] Relevant tests pass locally
- [x] Relevant lint / type checks pass locally
- [x] User-facing docs or screenshots are updated when needed

Commands run:

- `raven --help`
- `raven deep-research --help`
- `raven tracing --help`
- `make check-large-files`
- `make check-commits COMMIT_RANGE=origin/main..HEAD`
- `git diff --check origin/main..HEAD -- README.md`

No Python test suite was run because this is a README-only documentation
change.

## Risk

- [x] Security impact considered
- [x] Backward compatibility considered
- [x] Rollback path is clear for risky changes

This is a documentation-only change and does not alter runtime behavior.

## Related Issues

N/A
## Summary

Update the Chinese README to match the recent English README feature
coverage.

The Chinese README now includes:
- Deep Research in the opening positioning and update note.
- Deep Research and tracing entries in the quick-start and command
sections.
- The Deep Research capability row in the comparison table.
- Evolver and tracing references in the use-case, architecture, repo
layout, docs, and status sections.

## Type

- [ ] Fix
- [ ] Feature
- [x] Docs
- [ ] CI / tooling
- [ ] Refactor
- [ ] Other

## Verification

- [ ] Relevant tests pass locally
- [x] Relevant lint / type checks pass locally
- [x] User-facing docs or screenshots are updated when needed

Commands run:
- `raven deep-research --help`
- `raven tracing --help`
- `make check-large-files`
- `make check-commits COMMIT_RANGE=origin/main..HEAD`
- `git diff --check origin/main..HEAD -- README.zh-CN.md`

No Python test suite was run because this is a Chinese README-only
documentation change.

## Risk

- [x] Security impact considered
- [x] Backward compatibility considered
- [x] Rollback path is clear for risky changes

This is a documentation-only change and does not alter runtime behavior.

## Related Issues

N/A
@gloryfromca

Copy link
Copy Markdown
Member

This PR was auto-closed by a history rewrite, not by a maintainer

On 2026-09-12 the main branch of this repository was replaced with a linearized history: all merge commits were folded into a single line and author emails were unified. Every commit received a new SHA, so your branch and main no longer share a common ancestor and GitHub can no longer compute a diff. That is why this PR was closed automatically; the API refuses to reopen it.

Your work is safe in your fork. Nothing in your repository was modified.

To restore this PR, rebase onto the new main and open a fresh one. The pre-rewrite main is preserved as a tag, which makes the rebase exact:

git remote add upstream https://github.com/EverMind-AI/Raven.git   # if you don't have it
git fetch upstream 'refs/tags/backup/pre-linearize-20260912:refs/tags/old-main'
git fetch upstream main
git rebase --onto upstream/main $(git merge-base <your-branch> old-main) <your-branch>
git push --force-with-lease

Then open a new PR and reference this one. Thank you for the contribution, and sorry for the disruption.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

WeChat send silently succeeds when iLink returns non-zero ret with errcode=0